package visitor;

import java.io.File;
import java.util.List;

/**
 * 访问者模式的核心思想是为了访问比较复杂的数据结构，不去改变数据结构，
 * 而是把对数据的操作抽象出来，在“访问”的过程中以回调形式在访问者中处理操作逻辑。
 * 如果要新增一组操作，那么只需要增加一个新的访问者。
 */
public class Test {
    public static void main(String[] args) {
        FileStructure fileStructure = new FileStructure(new File("/Users/zhangyuxin/Documents/workspace/design-pattern"));

        Visitor visitor1 = new JavaFileVisitor();
        fileStructure.handle(visitor1);

        System.out.println("----------------------------------------------------");

        Visitor visitor2 = new ClassFileCleanerVisitor();
        fileStructure.handle(visitor2);

    }

    /**
     * 没有访问者的写法：
     * 以下代码的问题在于，扫描目录的逻辑和处理.java文件的逻辑混在了一起。
     * 如果下次需要增加一个清理.class文件的功能，就必须再重复写扫描逻辑。
     */
    void scan(File dir, List<File> collector) {
        for (File file : dir.listFiles()) {
            if (file.isFile() && file.getName().endsWith(".java")) {
                collector.add(file);
            } else if (file.isDirectory()) {
                // 递归调用:
                scan(file, collector);
            }
        }
    }
}
